/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOCategoriaArticulo;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.CategoriaArticulo;

/**
 *
 * @author DESARROLLO01
 */
@SuppressWarnings("unchecked")
@Repository("daoCategoriaArticulo")
public class DAOCategoriaArticuloImpl extends DaoImpl<CategoriaArticulo, Integer> implements IDAOCategoriaArticulo, Serializable {

    private static Logger logger = Logger.getLogger(DAOCategoriaArticuloImpl.class);
    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    public Collection<CategoriaArticulo> obtenerCategoriasPadres() throws DAOException {
        List<CategoriaArticulo> listacategoriaPadres = new ArrayList<CategoriaArticulo>();
        try {
            sessionFactory.getCurrentSession().flush();
            listacategoriaPadres = sessionFactory.getCurrentSession().createCriteria(CategoriaArticulo.class).add(Restrictions.like("tipoCategoria", "P"))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .list();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

        return listacategoriaPadres;
    }

    @Transactional
    public Collection<CategoriaArticulo> obtenerCategoriasPorFiltro(CategoriaArticulo categoriaArticulo) throws DAOException {
        List<CategoriaArticulo> listacategoria = new ArrayList<CategoriaArticulo>();
        try {
            sessionFactory.getCurrentSession().flush();
            listacategoria = sessionFactory.getCurrentSession().createCriteria(CategoriaArticulo.class)
                    .add(Restrictions.like("nombre", "%" + categoriaArticulo.getNombre().trim() + "%"))
                    .add(Restrictions.like("tipoInsumo", categoriaArticulo.getTipoInsumo()))
                    .add(Restrictions.like("tipoMaterial", categoriaArticulo.getTipoMaterial()))
                    .add(Restrictions.like("tipoCategoria", categoriaArticulo.getTipoCategoria()))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .addOrder(Order.desc("id"))
                    .list();

        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }
        return listacategoria;
    }

    @Override
    public CategoriaArticulo obtenerCategoriaArticuloPorNombre(String nombreCategoriaArticulo) throws DAOException {
        CategoriaArticulo categoriaArticuloBuscado = null;
        try {
            categoriaArticuloBuscado = (CategoriaArticulo) sessionFactory.getCurrentSession().createCriteria(CategoriaArticulo.class)
                    .add(Restrictions.eq("nombre", nombreCategoriaArticulo))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .uniqueResult();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return categoriaArticuloBuscado;
    }

    @Transactional
    public Collection<CategoriaArticulo> obtenerCategoriasHijos(CategoriaArticulo categoriaArticulo) throws DAOException {
        List<CategoriaArticulo> listacategoriaHijos = new ArrayList<CategoriaArticulo>();
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(CategoriaArticulo.class)
                    .add(Restrictions.eq("tipoCategoria", 'H'))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()));
            if(categoriaArticulo != null){
                query = query.add(Restrictions.eq("idCategoriaArticulo", categoriaArticulo));
            }
            listacategoriaHijos = query.list();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

        return listacategoriaHijos;
    }

    @Transactional
    public Collection<CategoriaArticulo> listarCategoriasTP() throws DAOException {
        List<CategoriaArticulo> listacategoriaHijos = new ArrayList<CategoriaArticulo>();
        try {
            sessionFactory.getCurrentSession().flush();
            listacategoriaHijos = sessionFactory.getCurrentSession().createCriteria(CategoriaArticulo.class)
                    .createAlias("idCategoriaArticulo", "ca")
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.disjunction()
                    .add(Restrictions.eq("nombre", "TELA"))
                    .add(Restrictions.eq("nombre", "PRENDA"))
                    .add(Restrictions.disjunction()
                    .add(Restrictions.eq("ca.nombre", "TELA"))
                    .add(Restrictions.eq("ca.nombre", "PRENDA")))).list();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

        return listacategoriaHijos;
    }

    @Override
    public CategoriaArticulo buscarCategoriaPadre(CategoriaArticulo categoriaArticulo) throws DAOException {
        CategoriaArticulo categoriaArticuloBuscado = null;
        try {
            categoriaArticuloBuscado = (CategoriaArticulo) sessionFactory.getCurrentSession().createCriteria(CategoriaArticulo.class)
                    .add(Restrictions.eq("idCategoriaArticulo", categoriaArticulo))
                    .add(Restrictions.eq("id", categoriaArticulo.getId()))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .uniqueResult();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return categoriaArticuloBuscado;
    }
}
